package principal;

import java.awt.HeadlessException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;

import javax.swing.JOptionPane;

import modelo.Almoxarifado;
import modelo.Produto;
import modelo.Requisicao;
import modelo.RequisicaoProduto;
import negocio.GerenciadorAlmoxarifado;
import negocio.GerenciadorItemRequisicao;
import negocio.GerenciadorProduto;
import negocio.GerenciadorRequisicao;
import negocio.NegocioException;

public class Aplicacao {

	public Aplicacao() {
	}

	public void correrAplicacao() {
		int opcao = -1;
		String menu = 
				"0 - sair\n" 
				+ "1 - cadastrar almoxarifado\n"
				+ "2 - Cadastrar produtos\n"
				+ "3 - Listar almoxarifados e produtos\n"
				+ "4 - Remover produto\n" 
				+ "5 - Remover Almoxarifado\n"
				+ "6 - Cadastrar requisicao de produto\n"
				+ "7 - Cadastrar itens da resquicao\n"
				+ "8 - Cadastrar requisicao de viagem\n"
				+ "9 - Listar requisições e produtos\n"
				+ "10 - Remover item requisicao\n" 
				+ "11 - Remover requisicao\n"
				+ "12 - Buscar produto\n" 
				+ "13 - Buscar almoxarifado\n"
				+ "14 - Buscar requisicao\n" 
				+ "\nEntre com a opção desejada:";
		do {
			try {
				opcao = Integer.parseInt(JOptionPane.showInputDialog(menu));
			} catch (NumberFormatException e) {
				JOptionPane
						.showMessageDialog(null,
								"Digite apenas numero para selecionar a opcao desejada . . .");
				opcao = -1;
			}
			switch (opcao) {
			case 0: // sair
				return;
			case 1:
				cadastrarAlmoxarifado();
				break;
			case 2:
				cadastrarProduto();
				break;
			case 3:
				listarAlmoxarifadosProdutos();
				break;
			case 4:
				removerProduto();
				break;
			case 5:
				removerAlmoxarifado();
				break;
			case 6:
				cadastrarRequisicao();
				break;
			case 7:
				cadastrarItemRequisicao();
				break;
			case 9:
				listarRequisicoesEProdutos();
				break;
			case 10:
				removerItemRequisicao();
				break;
			case 11:
				removerRequisicao();
				break;
			case 12:
				buscarProduto();
				break;
			case 13:
				buscarAlmoxarifado();
				break;
			case 14:
				buscarRequisicao();
				break;
			default:
				JOptionPane.showMessageDialog(null, "Opção Invalida");
				break;
			}
		} while (opcao != 0);
	}

	private void removerRequisicao() {
		int numeroRequisicao = Integer.parseInt(JOptionPane.showInputDialog("Entre com o numero do almoxarifado"));
		try {
			GerenciadorRequisicao gerenciadorRequisicao = new GerenciadorRequisicao();
			gerenciadorRequisicao.removerRequisicao(numeroRequisicao);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
	}
	
	private void removerAlmoxarifado() {
		int codigo = Integer
				.parseInt(JOptionPane
						.showInputDialog("Entre com o código do almoxarifado que você deseja remover"));
		try {
			GerenciadorAlmoxarifado gerenciadorAlmoxarifado = new GerenciadorAlmoxarifado();
			gerenciadorAlmoxarifado.removerAlmoxarifado(codigo);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
	}

	private void removerItemRequisicao() {
		int codProduto = Integer.parseInt(JOptionPane.showInputDialog("Entre com o codigo do produto"));
		int numeroRequisicao = Integer.parseInt(JOptionPane.showInputDialog("Entre com o numero da requisicao"));
		
		try {
			GerenciadorItemRequisicao gerenciadorItemRequisicao = new GerenciadorItemRequisicao();
			gerenciadorItemRequisicao.removerItemRequisicao(codProduto, numeroRequisicao);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
	}
	private void removerProduto() {
		int codigo = Integer
				.parseInt(JOptionPane
						.showInputDialog("Entre com o código do produto que voce deseja remover"));

		try {
			GerenciadorProduto gerenciadorProduto = new GerenciadorProduto();
			gerenciadorProduto.removerProduto(codigo);
		} catch (NegocioException e) {
			e.printStackTrace();
		}

	}
	private void cadastrarItemRequisicao() {
		int codProduto = Integer.parseInt(JOptionPane.showInputDialog("Entre com o código do produto"));
		int numeroRequisicao = Integer.parseInt(JOptionPane.showInputDialog("Entre com o número da requisicao"));
		int quantidade = Integer.parseInt(JOptionPane.showInputDialog("Entre com a quantidade"));
		double valorInstantaneo = Double.parseDouble(JOptionPane.showInputDialog("Entre com o valor instantaneo"));
		
		try {
			GerenciadorItemRequisicao gerenciadorItemRequisicao = new GerenciadorItemRequisicao();
			gerenciadorItemRequisicao.cadastrarItemRequisicao(codProduto, numeroRequisicao, quantidade, valorInstantaneo);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
	}
	private void cadastrarRequisicao() {
		int numero = Integer.parseInt(JOptionPane
				.showInputDialog("Entre com o número da requisicao"));
		String nomePessoa = JOptionPane
				.showInputDialog("Entre com o requisitante");
		int ano = Integer.parseInt(JOptionPane
				.showInputDialog("Entre com o ano da requisicao"));

		Date dataCadastro = null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
			dataCadastro = sdf.parse(JOptionPane
					.showInputDialog("Entre com a data de cadastro"));
		} catch (HeadlessException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}

		RequisicaoProduto requisicaoProduto = new RequisicaoProduto(numero,
				nomePessoa, dataCadastro, ano);

		try {
			GerenciadorRequisicao gerenciadorRequisicao = new GerenciadorRequisicao();
			gerenciadorRequisicao.cadastrarRequisicao(requisicaoProduto);
		} catch (NegocioException e) {
			e.printStackTrace();
		}

	}

	private void buscarRequisicao() {
		int numero = Integer.parseInt(JOptionPane.showInputDialog("Entre com o 'numero' da requisição"));
		Requisicao requisicao = null;
		try {
			GerenciadorRequisicao gerenciadorRequisicao = new GerenciadorRequisicao();
			requisicao = gerenciadorRequisicao.carregaRequisicao(numero);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
		if(requisicao != null){
			JOptionPane.showMessageDialog(null, requisicao);
		}else{
			JOptionPane.showMessageDialog(null, "Requisição não encontrada");
		}
	}

	private void buscarAlmoxarifado() {
		int codAlmoxarifado = Integer.parseInt(JOptionPane.showInputDialog("Entre com o códido do almoxarifado"));
		Almoxarifado almoxarifado = null;
		try {
			GerenciadorAlmoxarifado gerenciadorAlmoxarifado = new GerenciadorAlmoxarifado();
			almoxarifado = gerenciadorAlmoxarifado.carregaAlmoxarifado(codAlmoxarifado);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
		if(almoxarifado != null){
			JOptionPane.showMessageDialog(null, almoxarifado);
		}else{
			JOptionPane.showMessageDialog(null, "Almoxarifado não encontrado");
		}
		
	}

	private void buscarProduto() {
		int codProduto = Integer.parseInt(JOptionPane
				.showInputDialog("Entre com o código do produto"));
		Produto produto = null;
		try {
			GerenciadorProduto gerenciadorProduto = new GerenciadorProduto();
			produto = gerenciadorProduto.carregaProduto(codProduto);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
		if (produto != null) {
			JOptionPane.showMessageDialog(null, produto);
		}else{
			JOptionPane.showMessageDialog(null, "Produto não encontrado");
		}
	}

	private void listarRequisicoesEProdutos() {
		GerenciadorRequisicao gerenciadorRequisicao = new GerenciadorRequisicao();

		try {
			Collection<Requisicao> requisicoes = gerenciadorRequisicao
					.carregaListaRequisicoes();
			JOptionPane.showMessageDialog(null, requisicoes);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
	}

	private void listarAlmoxarifadosProdutos() {
		try {
			GerenciadorAlmoxarifado gerenciadorAlmoxarifado = new GerenciadorAlmoxarifado();

			// listar almoxarifados e produtos
			Collection<Almoxarifado> almoxarifados = gerenciadorAlmoxarifado
					.carregaListaAlmoxarifados();
			JOptionPane.showMessageDialog(null, almoxarifados);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
	}


	private void cadastrarProduto() {
		int codAlmoxarifado = Integer.parseInt(JOptionPane
				.showInputDialog("Entre com o codigo do almoxarifado"));
		int codigo = Integer.parseInt(JOptionPane
				.showInputDialog("Entre com o codigo do produto"));
		String denominacao = JOptionPane
				.showInputDialog("Entre com a denominacao do produto");
		int quantidade = Integer.parseInt(JOptionPane
				.showInputDialog("Entre com a quantidade do produto"));
		String unidadeMedida = JOptionPane
				.showInputDialog("Entre com a unidade de medida do produto");
		double valor = Double.parseDouble(JOptionPane
				.showInputDialog("Entre com o valor do produto"));

		Almoxarifado almoxarifado = new Almoxarifado();
		almoxarifado.setCodigo(codAlmoxarifado);

		Produto produto = new Produto(codigo, denominacao, quantidade,
				unidadeMedida, valor);
		produto.setAlmoxarifado(almoxarifado);

		try {
			GerenciadorProduto gerenciadorProduto = new GerenciadorProduto();
			gerenciadorProduto.cadastrarProduto(produto);
		} catch (NegocioException e) {
			e.printStackTrace();
		}
	}

	private void cadastrarAlmoxarifado() {
		int codigo = Integer.parseInt(JOptionPane
				.showInputDialog("Entre com o codigo do almoxarifado"));
		String nome = JOptionPane
				.showInputDialog("Entre com o nome do almoxarifado");

		Almoxarifado almoxarifado = new Almoxarifado();
		almoxarifado.setCodigo(codigo);
		almoxarifado.setNome(nome);

		try {
			GerenciadorAlmoxarifado gerenciadorAlmoxarifado = new GerenciadorAlmoxarifado();
			gerenciadorAlmoxarifado.cadastrarAlmoxarifado(almoxarifado);
		} catch (NegocioException e) {
			e.printStackTrace();
		}

	}

}
